package board;


public interface Move extends Cord 
{
	
	/*
	 * Denna används för att visa riktning vid t.ex. MoveRule.
	 * 
	 * För att man ska kunna generalisera metoder där koordinater måste användas.
	 */
	public static enum Direction
	{
				
		Up 		(0,-1),
		Left 	(-1,0),
		Right	(+1,0),
		Down	(0,+1);
		
		private int xDiff;
		private int yDiff;
		
		Direction( int xDiff, int yDiff )
		{
			this.xDiff = xDiff;
			this.yDiff = yDiff;
		}
		
		public Direction reverse()
		{
			return Direction.reverse(this);
		}
		
		/**
		 * 
		 * Tar en riktning och returnerar den inverterade riktningen.
		 * 
		 * @param direction Den ursprungliga riktningen.
		 * @return Den inverterade riktningen.
		 */
		public static Direction reverse( Direction direction )
		{
	          switch (direction) 
	          {
	  	        case Up: return Down;
	  	        case Left: return Right;
	  	        case Right: return Left;
	  	        case Down: return Up;
	  	        
	  	        default: throw new IllegalArgumentException();
	          }
		}
		
		/**
		 * 
		 * @param c
		 * @return
		 */
		public static Direction create( char c )
		{
	          switch (c) 
	          {
	  	        case 'U': return Up;
	  	        case 'L': return Left;
	  	        case 'R': return Right;
	  	        case 'D': return Down;
	  	        
	  	        default: throw new IllegalArgumentException();
	          }
		}
		
		/**
		 * @return skillnaden i x-led på brädet om man tar ett steg i denna riktning.
		 */
		public int getXDiff()
		{
			return xDiff;
		}
		
		/**
		 * @return skillnaden i y-led på brädet om man tar ett steg i denna riktning.
		 */
		public int getYDiff()
		{
			return yDiff;
		}
		
		public String toString()
		{
	          switch (this) 
	          {
	  	        case Up: return "U";
	  	        case Left: return "L";
	  	        case Right: return "R";
	  	        case Down: return "D";
	  	        
	  	        default: throw new IllegalArgumentException();
	          }
		}

		public static Direction[] getValues() 
		{
			return new Direction[]{ Up,Right,Left,Down };
		}

	}
	
	/**
	 * Skapar ett nytt Move-objekt igenom att utifrån detta Move flytta ett steg åt en given riktning
	 * 
	 * @param direction Riktningen flytten är åt.
	 * @return Ett nytt Move-objekt med koordinater efter flytten.
	 */
	public Move doNewMove( Direction direction );
	
	public Direction getDirectionToThis();	
	
	public String getPathToThis();
	
//	@Override
//	public Move clone();
	
}
